/*
 * 版权声明 (c) 2025 XXX科技有限公司
 *
 * 本软件及其相关文档文件受版权保护。未经版权所有者明确书面许可，任何单位或个人不得
 * 以任何形式复制、传播、修改、出售、出租、反向工程、反编译或利用本软件的任何部分。
 *
 * 对于任何违反本声明的行为，版权所有者保留追究法律责任的权利。
 */

#ifndef __MODEL_H__
#define __MODEL_H__

#include <string>
#include <iostream>
#include <sstream>
#include <stdint.h>
#define LONGLONG long long

using namespace std;

// 网关召唤消息
struct SummonInfo {
	std::string GateWayIP;
	uint16_t    GatewayPort;
	std::string AgentIP;
	uint16_t    AgentPort;

	std::string encode() const {
		std::stringstream ss;
		ss << GateWayIP << "|" << GatewayPort << "|" << AgentIP << "|" << AgentPort;
		return ss.str();
	}

	static SummonInfo decode(const std::string &str) {
		std::stringstream ss(str);
		SummonInfo        info;
		std::string       temp;
		std::getline(ss, info.GateWayIP, '|');
		std::getline(ss, temp, '|');
		info.GatewayPort = static_cast<uint16_t>(std::stoi(temp));
		std::getline(ss, info.AgentIP, '|');
		std::getline(ss, temp, '|');
		info.AgentPort = static_cast<uint16_t>(std::stoi(temp));
		return info;
	}
};

enum class ApiChannel {
	UNKNOWN      = 0, // 未知
	GatewayTable = 1, // 网关集合
	AgentTable   = 2, // 客户端代理
	SessionTable = 3, // 会话列表
};


struct ApiModel {
	string Id;
	// const char  *action; // 动作
	// const ushort sender_port;
};

/// @brief 客户端代理信息
struct AgentModel {
	int      SockFd;
	string   Name;     // 服务名称
	string   Origin;   // (客户端)源地址
	string   Gateway;  // 目标网关地址
	string   Target;   // 目标服务地址
	LONGLONG Duration; // 服务运行时长(秒)
};

struct SessionModel {
	string Origin;   // 源地址
	string Target;   // 目标地址
	string Service;  // 目标服务
	int    SockFd;   // 会话SockFd
	int    Duration; // 运行时长
	int    Status;   // 会话状态
};


struct PingEvent {
	int         SockFd;
	const char *SenderIp;
	ushort      SenderPort;
	string      Result;
};

#endif // __MODEL_H__
